package com.yiwenup.struct._01_linear.base;

/**
 *
 */
public abstract class AbstractList<E> implements List<E> {
    /**
     * 元素数量
     */
    protected int size = 0;

    /**
     * 元素的数量
     *
     * @return 元素的数量
     */
    public int size() {
        return this.size;
    }

    /**
     * 判断是否为空
     *
     * @return 是否为空
     */
    public boolean isEmpty() {
        return this.size == 0;
    }

    /**
     * 是否包含元素
     *
     * @param ele 元素
     * @return 检查结果
     */
    public boolean contains(E ele) {
        return indexOf(ele) >= 0;
    }

    /**
     * 在数组尾部插入一个元素
     *
     * @param ele 待处理元素
     */
    public void add(E ele) {
//        this.elements[this.size++] = ele;
        insert(this.size, ele);
    }

    protected void outOfBounds(int idx) {
        throw new IndexOutOfBoundsException("Index:" + idx + ", Size:" + size);
    }

    protected void rangeCheck(int idx) {
        if (idx < 0 || idx >= size) {
            outOfBounds(idx);
        }
    }

    protected void rangeCheckForAdd(int idx) {
        if (idx < 0 || idx > size) {
            outOfBounds(idx);
        }
    }
}
